package com.xxx.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.xxx.dao.UserDao;
import com.xxx.pojo.User;
import com.xxx.service.UserService;
import com.xxx.service.ex.*;
import com.xxx.service.utils.MD5Util;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service
public class UserServiceImpl extends ServiceImpl<UserDao,User> implements UserService {
    @Autowired
    private UserDao userDao;

    //注册功能
    public void register(User user){
        //通过传来的user对象 获取用户名 判断是否已经被注册
        Map<String, Object> map=new HashMap<>();
        map.put("username",user.getUsername());
        List<User> result = userDao.selectByMap(map);
        if(result.size()>0){
            //长度大于0  说明用户名已经存在 抛出异常
            throw new UsernameException("用户名已被占用!");
        }
        /**
         * 首次注册 补全剩余信息
         *  createdUser  createdTime  modifiedUser modifiedTime  isDelete;
         */
        user.setCreatedUser(user.getUsername());
        user.setCreatedTime(new Date());
        user.setModifiedUser(user.getUsername());
        user.setModifiedTime(new Date());
        user.setIsDelete(0);
        //防止密码明文 使用MD5加密算法对密码进行加密
        String newPassword= MD5Util.getMD5(user.getPassword()).toUpperCase();
        System.out.println("新密码=>>>"+newPassword);
        user.setPassword(newPassword);
        //否则进行注册
        int row = userDao.insert(user);
        if(row!=1){ //假如插入时出现异常
            throw new InsertException("用户注册出现异常");
        }
    }

    //登录功能
    @Override
    public List<User> login(User user) {
        //通过传来的user对象 获取用户名密码 判断数据库中是否存在
        //对密码进行MD5加密再查询比较
        String newPassword=MD5Util.getMD5(user.getPassword());
        Map<String, Object> map=new HashMap<>();
        map.put("username",user.getUsername());
        map.put("password",newPassword);
        map.put("is_delete",0);
        List<User> users = userDao.selectByMap(map);
        if(users.size()>0){//长度不为零 账户存在且密码正确 返回
            return users;
        }
        throw new UserNotFoundException("用户名或密码错误");
    }

    //修改密码功能
    @Override
    public void updatePassword(Integer uid,String username,String password, String newPassword) {
        Map<String, Object> map = new HashMap<>();
        map.put("uid",uid);
        List<User> result = userDao.selectByMap(map);
        if(result.size()==0||result.get(0).getIsDelete()==1){//用户不存在
            throw new UserNotFoundException("用户数据不存在");
        }
        //原始密码和数据库中的比较 先加密
        if(!result.get(0).getPassword().equals(MD5Util.getMD5(password).toUpperCase())){//匹配失败
            throw new PasswordException("密码错误");
        }
        //将新的密码存入数据库
        User user=new User();
        user.setPassword(MD5Util.getMD5(newPassword).toUpperCase());
        //最后操作时间
        user.setModifiedTime(new Date());
        //最后操作人
        user.setModifiedUser(username);
        //设置修改条件
        LambdaQueryWrapper<User> wrapper=new LambdaQueryWrapper<>();
        wrapper.eq(User::getUid,uid);
        int row = userDao.update(user, wrapper);
        if(row!=1){
            throw new UpdatException("修改密码出错");
        }
    }

    //获取单个用户信息功能 显示在页面上
    @Override
    public User getByUid(Integer uid) {
        Map<String, Object> map=new HashMap<>();
        map.put("uid",uid);
        map.put("is_delete",0);
        List<User> list = userDao.selectByMap(map);
        if(list.size()!=1){
            throw new UserNotFoundException("用户数据不存在");
        }
        return list.get(0);
    }

    //更新用户数据功能
    @Override
    public void updateUserData(User user) {
        //最后操作时间
        user.setModifiedTime(new Date());
        //最后操作人
        user.setModifiedUser(user.getUsername());
        LambdaQueryWrapper<User> wrapper=new LambdaQueryWrapper<>();
        wrapper.eq(User::getUid,user.getUid());
        int row = userDao.update(user, wrapper);
        if(row!=1){
            throw new UpdatException("修改个人资料出错");
        }
    }
    //修改用户头像功能

    @Override
    public void updateAvatar(Integer uid,String avatarPath,String username) {
        //先查询当前用户是否存在
        Map<String, Object> map=new HashMap<>();
        map.put("uid",uid);
        map.put("is_delete",0);
        List<User> list = userDao.selectByMap(map);
        if(list.size()!=1){
            throw new UserNotFoundException("用户数据不存在");
        }
        LambdaQueryWrapper<User> wrapper=new LambdaQueryWrapper<>();
        wrapper.eq(User::getUid,uid);
        User user = new User();
        //设置头像路径
        user.setAvatar(avatarPath);
        //最后操作时间
        user.setModifiedTime(new Date());
        //最后操作人
        user.setModifiedUser(username);
        int row = userDao.update(user, wrapper);
        if(row!=1){
            throw new UpdatException("修改头像出错");
        }

    }
}
